RemoveIndexSignature<R>
使用例
code:ts
type C = RemoveIndexSignature<Foo>; // { foo(): void, baz: string, 1: string }
type Foo = {
foo(): void;
baz: string;
1: string;
};
定義
code:ts
// prettier-ignore
type RemoveIndexSignature<T> = {
[K in keyof T as
string extends K ? never
: number extends K ? never
};
考え方
次に、どういう条件か?を考える
fieldは4種類ほどある
code:ts
type Foo = {
foo(): void;
baz: string;
1: string;
};
ここから、indexed signatureであることを判定して省く必要がある
定義の意味
ポイントは[]の中の意味
K in keyof T as string extends K ? never : number extends K ? never : K
括弧を付けるならどうなるか?
(K in keyof T) as (.. ? .. : ..)という構造
keyof Tで展開した後のKに対してas (.. ? .. : ..)がかかっている
定義を見てしまえば単純で、
取りうるfieldから、stringかnumberであるものを残しているだけ
別解っぽいが別解ではないもの
これはtype-challenges 1367では解答になりうる
解答欄に1: stringのようなnumberなfieldが無いから。
code:ts
type RemoveIndexSignature<T extends Record<string, unknown>> = {
[K in keyof T as (K extends ${infer _} ? K : never)]: TK }
これは{ 1: string }のようなものも省いてしまうので適切ではないmrsekut.icon
なんでこれ無理なん?
code:ts
type RemoveIndexSignature<T> = {
};